package com.naiterui.ehp.ps.sms.factory;

import java.util.Map;

import cn.hutool.core.util.BooleanUtil;
import com.naiterui.ehp.bp.utils.lang.ConfigUtil;
import org.apache.commons.lang3.StringUtils;

import com.naiterui.ehp.bp.utils.lang.StringUtil;
import com.naiterui.ehp.ps.sms.cache.SmsRedisManager;
import com.naiterui.ehp.ps.sms.enums.PlatformType;
import com.naiterui.ehp.ps.sms.exception.ExceptionCodes;
import com.naiterui.ehp.ps.sms.exception.SmsBusinessException;
import com.naiterui.ehp.ps.sms.factory.yunuo.YunuoSms;
import com.naiterui.ehp.ps.sms.vo.MessageResponseVO;
import com.naiterui.ehp.ps.sms.vo.SignatureVO;
import com.naiterui.ehp.ps.sms.vo.TemplateVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

/**
 * 发短信通用类
 *
 * @author
 * @since 1.0.0
 */
@Slf4j
public class SendMessageUtil {
    private static final String TEMPLATE_PARAM_PREFIX = "{";// 模板参数前缀
    private static final String TEMPLATE_PARAM_SUFFIX = "}";// 模板参数后缀
    private static final int SMS_CONTENT_MAX_LENGTH = 360;// 发送内容最大长度
    private static final int COMMON_MESSAGE_MAX_LENGTH = 70;// 普通短信单条最大长度
    private static final int LONG_MESSAGE_MAX_LENGTH = 67;// 长短新每条最大长度
    private static String isGeneralTemplated = ConfigUtil.getString("naiterui.sms.cloopen-is-general-templated");

    /**
     * SendMessageUtil.singleSend()
     *
     * @param platformId
     * @param phone
     * @param datas
     *
     * @throws SmsBusinessException
     * @Author
     * @Date 2017年7月27日
     * @since 1.0.0
     */
    public static MessageResponseVO singleSend(Integer platformId, SignatureVO signatureVO, TemplateVO templateVO,
        String phone,
                                               String[] datas) throws SmsBusinessException {
        String msgContent = replaceTemplateContent(templateVO.getContent(), datas);
        // 验证短信内容长度，不能超过360个字
        int contentLen = msgContent.trim().length();
        if (contentLen == 0) {
            throw new SmsBusinessException(ExceptionCodes.SMS_CONTENT_NULL);
        }
        if (contentLen > SMS_CONTENT_MAX_LENGTH) {
            throw new SmsBusinessException(ExceptionCodes.SMS_CONTENT_OVERLENGTH);
        }

        if (!StringUtil.isMobileNum(phone)) {
            throw new SmsBusinessException(ExceptionCodes.SMS_PHONE_ERROR);
        }

        if (StringUtils.isEmpty(signatureVO.getName())) {
            throw new SmsBusinessException(ExceptionCodes.SMS_SIGNATURE_NAME_EMPTY);
        }

        MessageResponseVO messageResponseVO = null;
        if (platformId == PlatformType.Montnet.value()) {// 发送梦网短信
            if (StringUtils.isEmpty(signatureVO.getMontnetBusinessId())) {
                throw new SmsBusinessException(ExceptionCodes.SMS_SIGNATURE_MONTNETID_EMPTY);
            }
            // 梦网需要自己将模板的内容替换为真实内容
            messageResponseVO = MontnetSms.siggleSend(phone, signatureVO.getMontnetBusinessId(), msgContent);
        } else if (platformId == PlatformType.Cloopen.value()) {// 发送容联短信
            if (BooleanUtil.toBoolean(isGeneralTemplated)) { // 区分是否通用模板
                if (StringUtils.isEmpty(signatureVO.getCloopenTemplateId())) {// 统一大模板,模板ID配置在前面上
                    throw new SmsBusinessException(ExceptionCodes.SMS_SIGNATURE_CLOOPENID_EMPTY);
                }
                String[] content = new String[1];
                content[0] = msgContent;
                messageResponseVO = CloopenSms.siggleSend(phone, signatureVO.getCloopenTemplateId(), content);
            } else {
                messageResponseVO = CloopenSms.siggleSend(phone, templateVO.getMsgTemplateId(), datas);
            }

        } else if (platformId == PlatformType.Huawei.value()) {// 发送华为短信
            if (StringUtils.isEmpty(templateVO.getMsgTemplateId())) {// 单条模板，模板ID配置在内部模板上，一对一配置
                throw new SmsBusinessException(ExceptionCodes.SMS_TEMPLATE_HUAWEI_EMPTY);
            }
            messageResponseVO = HuaweiSms.singleSend(phone, signatureVO.getChannelNumber(), templateVO.getMsgTemplateId(), datas, platformId);
        } else if (platformId == PlatformType.Huaxin.value()) {  //发送华信短信
            // 华信直接发送  签名+内容
            String sendContent = getRealContent(signatureVO.getName(), msgContent);
            messageResponseVO = HuaxinSms.siggleSend(phone, sendContent);
        } else if (platformId == PlatformType.ALIYUN.value()) { // 发送阿里云短信
            // 阿里云
            Map<String, String> sendContent = AliyunApi.buildParamMap(templateVO.getContent(), datas);
            messageResponseVO = AliyunApi.singleSend(phone, signatureVO.getName(), templateVO.getMsgTemplateId(), sendContent);
        } else if (platformId == PlatformType.Yunuo.value()) { // 发送雨诺短信
            // 雨诺短信发送 内容
            messageResponseVO = YunuoSms.singleSend(phone, templateVO.getMsgTemplateId(), datas);
        } else if (platformId == PlatformType.Chuanglan.value()) {//创蓝短信
            String sendContent = getRealContent(signatureVO.getName(), msgContent);
            messageResponseVO = ChuanglanSms.singleSend(phone, sendContent);
        } else if (platformId == PlatformType.Hongdou.value()) { // 发送红豆短信
            // 红豆短信发送 签名+内容
            String sendContent = getRealContent(signatureVO.getName(), msgContent);
            messageResponseVO = HongdouSms.siggleSend(phone, sendContent);
        }
        if (messageResponseVO != null && messageResponseVO.getStatusCode().equals(String.valueOf(ExceptionCodes.SUCCESS))) {
            // 发送成功,记录发送短信数,当模板发送数
            String realContent = getRealContent(signatureVO.getName(), msgContent);
            int splitCount = getRealContentSplitCount(realContent);
            int realContentLen = realContent.length();
            boolean longMsg = splitCount > 1;
            log.info("发送短信完成，更新发送数：平台ID: {}, 签名ID: {}, 短信增加数：{}, 短信长度：{}, 是否为长短信： {}", platformId, signatureVO.getId(),
                     splitCount, realContentLen, longMsg);
            SmsRedisManager.incrMessageCount(platformId, signatureVO.getId(), splitCount);
        }
        return messageResponseVO;
    }

    /**
     * 将模板内容替换为真正的内容
     * SendMessageUtil.replaceTemplateContent()
     *
     * @param templateContent
     * @param datas
     *
     * @return
     *
     * @throws SmsBusinessException
     * @Author
     * @Date 2017年7月27日
     * @since 1.0.0
     */
    public static String replaceTemplateContent(String templateContent, String[] datas) throws SmsBusinessException {
        if (StringUtils.isEmpty(templateContent)) {
            throw new SmsBusinessException(ExceptionCodes.SMS_TEMPLATE_ERROR);
        }

        int idx = 1;
        if (datas != null) {
            for (String data : datas) {
                templateContent = templateContent.replace(TEMPLATE_PARAM_PREFIX + idx + TEMPLATE_PARAM_SUFFIX, data);
                idx++;
            }
        }
        return templateContent;
    }

    /**
     * 获取发送的实际内容
     * SendMessageUtil.getRealContent()
     *
     * @param content
     *
     * @return
     *
     * @Author
     * @Date 2018年2月6日
     * @since 1.0.0
     */
    private static String getRealContent(String signatureName, String content) {
        return "【" + signatureName + "】" + content;
    }

    /**
     * 获取发送短信拆分为几条发送
     * SendMessageUtil.getRealContentSplitCount()
     *
     * @param content
     *
     * @return
     *
     * @Author
     * @Date 2018年2月6日
     * @since 1.0.0
     */
    private static int getRealContentSplitCount(String content) {
        if (StringUtils.isEmpty(content)) {
            return 0;
        }
        int contentLen = content.length();
        // 小于70个字符为普通短信
        if (contentLen <= COMMON_MESSAGE_MAX_LENGTH) {
            return 1;
        }
        // 超过70个字符，按每条67个字符分割短信
        int ret = contentLen / LONG_MESSAGE_MAX_LENGTH;
        if (contentLen % LONG_MESSAGE_MAX_LENGTH > 0) {
            ret++;
        }
        return ret;
    }
}
